// 属性模拟工具
// 模拟单位的 攻击力  护甲  力量  敏捷  智力
// @author:wangff8@qq.com   @date:2024-04-18
library PropertyUtil requires YDWETimerSystem

    // 注意：Set属性的方法一般在单位初始创建的时候使用
    // 每点力量增加 3 点生命值
    // 每1W敏捷增加1%攻速   最多增加200%
    // 每1W智力增加1%的技能伤害  最多增加200%
    // 每点主属性增加0.1的攻击力

    globals
        // 用于存储每个单位模拟的属性  一次性单位死亡要清空hash
        hashtable proHash = InitHashtable()

        // 父Key是单位的句柄
        // 攻击力的子Key
        constant integer FF_PRO_ATTACK = 100
        // 护甲的子Key
        constant integer FF_PRO_ARMOR = 101
        // 力量
        constant integer FF_PRO_STR = 102
        // 敏捷
        constant integer FF_PRO_AGI = 103
        // 智力
        constant integer FF_PRO_INT = 104
        // 生命值（这个备用，暂时做了，里面用原生操作，以防万一以后有使用）
        constant integer FF_PRO_HP = 105
        // 最大生命值
        constant integer FF_PRO_MAX_HP = 106

        // 攻击力加成
        constant integer FF_PRO_ATTACK_ADDITION = 110
        // 护甲加成
        constant integer FF_PRO_ARMOR_ADDITION = 111
        // 力量加成
        constant integer FF_PRO_STR_ADDITION = 112
        // 敏捷加成
        constant integer FF_PRO_AGI_ADDITION = 113
        // 智力加成
        constant integer FF_PRO_INT_ADDITION = 114
        // 最大生命值加成
        constant integer FF_PRO_MAX_HP_ADDITION = 116


        // 怪物专属的一些词条
        // 怪物的暴击几率
        constant integer FF_PRO_CRIT = 1000
        // 怪物的暴击伤害
        constant integer FF_PRO_CRIT_DAMAGE = 1001

        // 单位类型Id  自定义的单位类型ID，相当与系统的四字编码
        constant integer FF_TYPE_ID = 10
        // 单位名称
        constant integer FF_PRO_NAME = 11

        // 单位种类  单位，英雄
        constant integer FF_TYPE_HERO = 2000
        // 自定义值）（可以做一些自定义的判断
        constant integer FF_TYPE_CUSTOM = 2001
        // 怪物所属
        constant integer FF_TYPE_OWNER = 2002
        // 怪物所属波数
        constant integer FF_TYPE_WAVE = 2003
        // 单位的X位置
        constant integer FF_PRO_X = 2004
        // 单位的Y位置
        constant integer FF_PRO_Y = 2005

        // 伤害事件
        constant integer FF_TYPE_DAMAGE_EVENT = 2006

        // 创建单位模板
        // 近程，无攻击弹道
        constant integer FF_ENEMY_TYPE_ONE = 'o009'
        // 远程，有攻击弹道
        constant integer FF_ENEMY_TYPE_TWO = 'h00I'

        // 3000开始存储一些临时值
        // 火焰飞剑术灼烧的剩余次数
        constant integer FF_TEMP_SK_1 = 3000
        // 闪电链持续伤害的剩余次数
        constant integer FF_TEMP_SK_2 = 3001
        // 寒冰箭冻伤的剩余次数
        constant integer FF_TEMP_SK_3 = 3002
    endglobals

    // 设置伤害触发
    function FF_SetDamageEvent takes unit u, trigger trig returns nothing
        call SaveTriggerHandle(proHash, GetHandleId(u), FF_TYPE_DAMAGE_EVENT, trig)
    endfunction
    // 获取伤害触发
    function FF_GetDamageEvent takes unit u returns trigger
        return LoadTriggerHandle(proHash, GetHandleId(u), FF_TYPE_DAMAGE_EVENT)
    endfunction

    // 设置X坐标
    function FF_SetUnitX takes unit u, real x returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_X, x)
    endfunction
    // 获取X坐标
    function FF_GetUnitX takes unit u returns real
        return LoadReal(proHash, GetHandleId(u), FF_PRO_X)
    endfunction

    // 设置Y坐标
    function FF_SetUnitY takes unit u, real y returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_Y, y)
    endfunction
    // 获取Y坐标
    function FF_GetUnitY takes unit u returns real
        return LoadReal(proHash, GetHandleId(u), FF_PRO_Y)
    endfunction

    // 设置怪物所属波数
    function FF_SetUnitWave takes unit u, integer wave returns nothing
        call SaveInteger(proHash, GetHandleId(u), FF_TYPE_WAVE, wave)
    endfunction
    // 获取怪物所属波数
    function FF_GetUnitWave takes unit u returns integer
        return LoadInteger(proHash, GetHandleId(u), FF_TYPE_WAVE)
    endfunction

    // 设置所属英雄的id，表示是谁的怪物，100表示系统怪
    function FF_SetUnitOwner takes unit u, integer id returns nothing
        call SaveInteger(proHash, GetHandleId(u), FF_TYPE_OWNER, id)
    endfunction
    // 获取所属英雄的id，表示是谁的怪物，100表示系统怪
    function FF_GetUnitOwner takes unit u returns integer
        return LoadInteger(proHash, GetHandleId(u), FF_TYPE_OWNER)
    endfunction

    // 获取单位主属性状态 1表示力量  2表示敏捷  3表示智力
    function getUnitPrimaryState takes unit u returns integer
        local integer v = 1
        // 表示智力
        if (YDWEGetObjectPropertyString( YDWE_OBJECT_TYPE_UNIT, GetUnitTypeId(u), "Primary") == "INT") then
            set v = 3
        elseif (YDWEGetObjectPropertyString( YDWE_OBJECT_TYPE_UNIT, GetUnitTypeId(u), "Primary") == "AGI") then
            set v = 2
        endif
        set u = null
        return v
    endfunction

    // 设置单位自定义值
    function FF_SetCustomValue takes unit u, integer value returns nothing
        call SaveInteger(proHash, GetHandleId(u), FF_TYPE_CUSTOM, value)
    endfunction
    // 获取单位自定义值
    function FF_GetCustomValue takes unit u returns integer
        return LoadInteger(proHash, GetHandleId(u), FF_TYPE_CUSTOM)
    endfunction


    // 设置单位名称
    function FF_SetUnitName takes unit u, string name returns nothing
        call SaveStr(proHash, GetHandleId(u), FF_PRO_NAME, name)
    endfunction
    // 获取单位名称
    function FF_GetUnitName takes unit u returns string
        return LoadStr(proHash, GetHandleId(u), FF_PRO_NAME)
    endfunction

    // 设置单位类型Id
    function FF_SetTypeId takes unit u, integer typeId returns nothing
        call SaveInteger(proHash, GetHandleId(u), FF_TYPE_ID, typeId)
    endfunction
    // 获取单位类型Id
    function FF_GetTypeId takes unit u returns integer
        return LoadInteger(proHash, GetHandleId(u), FF_TYPE_ID)
    endfunction

    // 设置单位种类 0表示普通单位  1表示是英雄 
    function FF_SetUnitType takes unit u, integer v returns nothing
        call SaveInteger(proHash, GetHandleId(u), FF_TYPE_HERO, v)
    endfunction
    // 判断单位类型是否是英雄
    function FF_IsHero takes unit u returns boolean
        return LoadInteger(proHash, GetHandleId(u), FF_TYPE_HERO) == 1
    endfunction
    // 判断英雄是否是普通单位
    function FF_IsNormalUnit takes unit u returns boolean
        return LoadInteger(proHash, GetHandleId(u), FF_TYPE_HERO) == 0
    endfunction

    // 设置攻击力加成
    function FF_SetAddition_Attack takes unit u, real v returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_ATTACK_ADDITION, v)
    endfunction
    // 获取攻击力加成
    function FF_GetAddition_Attack takes unit u returns real
        return LoadReal(proHash, GetHandleId(u), FF_PRO_ATTACK_ADDITION)
    endfunction
    // 增加单位攻击力加成
    function FF_AddAddition_Attack takes unit u, real v returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_ATTACK_ADDITION, FF_GetAddition_Attack(u) + v)
    endfunction
    // 减少单位攻击力加成
    function FF_SubAddition_Attack takes unit u, real v returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_ATTACK_ADDITION, FF_GetAddition_Attack(u) - v)
    endfunction
    // 设置单位的攻击力（基础）
    function FF_SetAttack takes unit u, real atk returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_ATTACK, atk)
    endfunction
    // 获取单位的攻击力（基础）
    function FF_Base_GetAttack takes unit u returns real
        return LoadReal(proHash, GetHandleId(u), FF_PRO_ATTACK)
    endfunction
    // 获取单位的攻击力（包括动态加成的）
    function FF_GetAttack takes unit u returns real
        return FF_Base_GetAttack(u) * (1.0 + FF_GetAddition_Attack(u))
    endfunction
    // 增加单位攻击力（基础）
    function FF_AddAttack takes unit u, real atk returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_ATTACK, FF_Base_GetAttack(u) + atk)
    endfunction
    // 减少单位攻击力（基础）
    function FF_SubAttack takes unit u, real atk returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_ATTACK, FF_Base_GetAttack(u) - atk)
    endfunction
    

    // 设置护甲基础加成
    function FF_SetAddition_Armor takes unit u, real v returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_ARMOR_ADDITION, v)
    endfunction
    // 获取护甲基础加成
    function FF_GetAddition_Armor takes unit u returns real
        return LoadReal(proHash, GetHandleId(u), FF_PRO_ARMOR_ADDITION)
    endfunction
    // 增加护甲基础加成
    function FF_AddAddition_Armor takes unit u, real v returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_ARMOR_ADDITION, LoadReal(proHash, GetHandleId(u), FF_PRO_ARMOR_ADDITION) + v)
    endfunction
    // 减少护甲基础加成
    function FF_SubAddition_Armor takes unit u, real v returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_ARMOR_ADDITION, LoadReal(proHash, GetHandleId(u), FF_PRO_ARMOR_ADDITION) - v)
    endfunction
    // 设置单位的护甲(基础)
    function FF_SetArmor takes unit u, real armor returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_ARMOR, armor)
    endfunction
    // 获取单位的护甲（基础）
    function FF_Base_GetArmor takes unit u returns real
        return LoadReal(proHash, GetHandleId(u), FF_PRO_ARMOR)
    endfunction
    // 获取单位的护甲（包括动态加成的）
    function FF_GetArmor takes unit u returns real
        return FF_Base_GetArmor(u) * (1.0 + FF_GetAddition_Armor(u))
    endfunction
    // 增加单位护甲(基础)
    function FF_AddArmor takes unit u, real armor returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_ARMOR, FF_Base_GetArmor(u) + armor)
    endfunction
    // 减少单位护甲(基础)
    function FF_SubArmor takes unit u, real armor returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_ARMOR, FF_Base_GetArmor(u) - armor)
    endfunction

    // 设置生命值加成
    function FF_SetAddition_Hp takes unit u, real v returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_MAX_HP_ADDITION, v)
    endfunction
    // 获取生命值加成
    function FF_GetAddition_Hp takes unit u returns real
        return LoadReal(proHash, GetHandleId(u), FF_PRO_MAX_HP_ADDITION)
    endfunction
    // 增加生命值加成
    function FF_AddAddition_Hp takes unit u, real v returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_MAX_HP_ADDITION, LoadReal(proHash, GetHandleId(u), FF_PRO_MAX_HP_ADDITION) + v)
    endfunction
    // 减少生命值加成
    function FF_SubAddition_Hp takes unit u, real v returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_MAX_HP_ADDITION, LoadReal(proHash, GetHandleId(u), FF_PRO_MAX_HP_ADDITION) - v)
    endfunction
    // 设置单位最大生命值（基础）
    function FF_SetMaxHp takes unit u, real hp returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_MAX_HP, hp)
        // 使用原生
        call SetUnitState(u, UNIT_STATE_MAX_LIFE, hp)
    endfunction
    // 获取单位当前生命值（基础）
    function FF_GetHp takes unit u returns real
        // return LoadReal(proHash, GetHandleId(u), FF_PRO_HP)
        return GetUnitState(u, UNIT_STATE_LIFE)
    endfunction
    // 获取单位最大生命值（基础）
    function FF_Base_getMaxHp takes unit u returns real
        // return LoadReal(proHash, GetHandleId(u), FF_PRO_MAX_HP)
        return GetUnitState(u, UNIT_STATE_MAX_LIFE)
    endfunction
    // 获取单位最大生命值（包括动态加成的）
    function FF_GetMaxHp takes unit u returns real
        return FF_Base_getMaxHp(u) * (1.0 + FF_GetAddition_Hp(u))
        // return GetUnitState(u, UNIT_STATE_MAX_LIFE)
    endfunction
    // 设置单位的当前生命值
    function FF_SetHp takes unit u, real hp returns nothing
        // 使用原生
        call SetUnitState(u, UNIT_STATE_LIFE, hp)
        // 记录
        call SaveReal(proHash, GetHandleId(u), FF_PRO_HP, hp)
    endfunction
    // 增加单位的当前生命值
    function FF_AddHp takes unit u, real hp returns nothing
        // 使用原生
        call SetUnitState(u, UNIT_STATE_LIFE, GetUnitState(u, UNIT_STATE_LIFE) + hp)
        // 记录
        call SaveReal(proHash, GetHandleId(u), FF_PRO_HP, LoadReal(proHash, GetHandleId(u), FF_PRO_HP) + hp)
    endfunction
    // 减少单位的当前生命值
    function FF_SubHp takes unit u, real hp returns nothing
        // 使用原生
        call SetUnitState(u, UNIT_STATE_LIFE, GetUnitState(u, UNIT_STATE_LIFE) - hp)
        // 记录
        call SaveReal(proHash, GetHandleId(u), FF_PRO_HP, LoadReal(proHash, GetHandleId(u), FF_PRO_HP) - hp)
    endfunction
    // 增加最大生命值
    function FF_AddMaxHp takes unit u, real hp returns nothing
        // 使用原生
        call SetUnitState(u, UNIT_STATE_MAX_LIFE, GetUnitState(u, UNIT_STATE_MAX_LIFE) + hp)
        // 记录
        call SaveReal(proHash, GetHandleId(u), FF_PRO_MAX_HP, LoadReal(proHash, GetHandleId(u), FF_PRO_MAX_HP) + hp)
    endfunction
    // 减少最大生命值（基础）
    function FF_SubMaxHp takes unit u, real hp returns nothing
        // 按照百分比减少当前生命值
        // 计算出减少的生命值的占比
        // local real hpPercent = hp / GetUnitState(u, UNIT_STATE_MAX_LIFE)
        // local real v = GetUnitState(u, UNIT_STATE_LIFE) - GetUnitState(u, UNIT_STATE_LIFE) * hpPercent
        // call FF_SetHp(u, v)

        // 使用原生
        call SetUnitState(u, UNIT_STATE_MAX_LIFE, GetUnitState(u, UNIT_STATE_MAX_LIFE) - hp)

        // 记录
        call SaveReal(proHash, GetHandleId(u), FF_PRO_MAX_HP, LoadReal(proHash, GetHandleId(u), FF_PRO_MAX_HP) - hp)
    endfunction
    // 获取生命百分比
    function FF_GetHpPercent takes unit u returns real
        return GetUnitLifePercent(u)
    endfunction


    // 通过主属性增加攻击力 status 1表示力量  2表示敏捷  3表示智力
    private function addPrimaryToAttack takes unit u, real primary, integer status returns nothing
        if getUnitPrimaryState(u) == status then
            call FF_AddAttack(u, primary / 10.0)
        endif
    endfunction
    private function subPrimaryToAttack takes unit u, real primary, integer status returns nothing
        if getUnitPrimaryState(u) == status then
            call FF_SubAttack(u, primary / 10.0)
        endif
    endfunction

    // 通过敏捷增加的攻击速度
    private function addAgiToSpeed takes unit u, real agi returns nothing
        local real speed = agi / 10000.0
        set speed = speed / 100.0
        // if speed > 2.0 then
        //     set speed = 2.0
        // endif
        call SetUnitState( u, ConvertUnitState(0x51), GetUnitState(u, ConvertUnitState(0x51)) + speed )
        call addPrimaryToAttack(u, agi, 2)
        set u = null
    endfunction
    private function subAgiToSpeed takes unit u, real agi returns nothing
        local real speed = agi / 10000.0
        set speed = speed / 100.0
        // if speed > 2.0 then
        //     set speed = 2.0
        // endif
        call SetUnitState( u, ConvertUnitState(0x51), GetUnitState(u, ConvertUnitState(0x51)) - speed )
        call subPrimaryToAttack(u, agi, 2)
        set u = null
    endfunction

    // 通过智力增加技能伤害
    private function addIntToSpellDamage takes unit u, real int returns nothing
        local integer uid = GetPlayerId(GetOwningPlayer(u))
        local real spellDamage = int / 10000.0
        set spellDamage = spellDamage / 100.0
        if spellDamage > 2.0 then
            set spellDamage = 2.0
        endif
        // set udg_hero_atk_spell[uid] = udg_hero_atk_spell[uid] + spellDamage
        call addPrimaryToAttack(u, int, 3)
        set u = null
    endfunction
    private function subIntToSpellDamage takes unit u, real int returns nothing
        local integer uid = GetPlayerId(GetOwningPlayer(u))
        local real spellDamage = int / 10000.0
        set spellDamage = spellDamage / 100.0
        if spellDamage > 2.0 then
            set spellDamage = 2.0
        endif
        // set udg_hero_atk_spell[uid] = udg_hero_atk_spell[uid] - spellDamage
        call subPrimaryToAttack(u, int, 3)
        set u = null
    endfunction

    // 通过力量增加生命值
    private function addStrToHp takes unit u, real str returns nothing
        call FF_AddMaxHp(u, str * 3.0)
        call FF_AddHp(u, str * 3.0)
        call addPrimaryToAttack(u, str, 1)
    endfunction
    private function subStrToHp takes unit u, real str returns nothing
        call FF_SubMaxHp(u, str * 3.0)
        call subPrimaryToAttack(u, str, 1)
    endfunction

    // 设置力量的加成
    function FF_SetAddition_Str takes unit u, real v returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_STR_ADDITION, v)
    endfunction
    // 获取力量的加成
    function FF_GetAddition_Str takes unit u returns real
        return LoadReal(proHash, GetHandleId(u), FF_PRO_STR_ADDITION)
    endfunction
    // 增加力量加成
    function FF_AddAddition_Str takes unit u, real v returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_STR_ADDITION, FF_GetAddition_Str(u) + v)
    endfunction
    // 减少力量加成
    function FF_SubAddition_Str takes unit u, real v returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_STR_ADDITION, FF_GetAddition_Str(u) - v)
    endfunction
    // 设置单位的力量（注意：设置会重置属性附带的额外其他加成，谨慎使用，一般用于初始创建）
    function FF_SetStr takes unit u, real str returns nothing
        call addStrToHp(u, str)
        call SaveReal(proHash, GetHandleId(u), FF_PRO_STR, str)
    endfunction
    // 获取单位的力量（基础）
    function FF_Base_GetStr takes unit u returns real
        return LoadReal(proHash, GetHandleId(u), FF_PRO_STR)
    endfunction
    // 获取单位的力量
    function FF_GetStr takes unit u returns real
        return FF_Base_GetStr(u) * (1.0 + FF_GetAddition_Str(u))
    endfunction
    // 增加单位力量
    function FF_AddStr takes unit u, real str returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_STR, FF_Base_GetStr(u) + str)

        // 增加单位增加相应的属性
        call addStrToHp(u, str)
    endfunction
    // 减少单位力量
    function FF_SubStr takes unit u, real str returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_STR, FF_Base_GetStr(u) - str)
        call subStrToHp(u, str)
    endfunction
    // 减少百分比的属性
    function FF_SubStrPercent takes unit u, real strPercent returns nothing
        call FF_SubStr(u, FF_Base_GetStr(u) * strPercent)
    endfunction
    // 增加百分比的属性
    function FF_AddStrPercent takes unit u, real strPercent returns nothing
        call FF_AddStr(u, FF_Base_GetStr(u) * strPercent)
    endfunction

    // ==============================================================


    // 设置单位敏捷加成
    function FF_SetAddition_Agi takes unit u, real agi returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_AGI_ADDITION, agi)
    endfunction
    // 获取单位敏捷加成
    function FF_GetAddition_Agi takes unit u returns real
        return LoadReal(proHash, GetHandleId(u), FF_PRO_AGI_ADDITION)
    endfunction
    // 增加单位敏捷加成
    function FF_AddAddition_Agi takes unit u, real agi returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_AGI_ADDITION, FF_GetAddition_Agi(u) + agi)
    endfunction
    // 减少单位敏捷加成
    function FF_SubAddition_Agi takes unit u, real agi returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_AGI_ADDITION, FF_GetAddition_Agi(u) - agi)
    endfunction
    // 设置单位的敏捷（注意：设置会重置属性附带的额外其他加成，谨慎使用，一般用于初始创建）
    function FF_SetAgi takes unit u, real agi returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_AGI, agi)
        // 计算攻速
        call addAgiToSpeed(u, agi)
    endfunction
    // 获取单位的敏捷（基础）
    function FF_Base_GetAgi takes unit u returns real
        return LoadReal(proHash, GetHandleId(u), FF_PRO_AGI)
    endfunction
    // 获取单位的敏捷
    function FF_GetAgi takes unit u returns real
        return FF_Base_GetAgi(u) * (1.0 + FF_GetAddition_Agi(u))
    endfunction
    // 增加单位敏捷
    function FF_AddAgi takes unit u, real agi returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_AGI, FF_Base_GetAgi(u) + agi)
        call SetUnitState( u, ConvertUnitState(0x51), GetUnitState(u, ConvertUnitState(0x51)) + agi / 2000.0 )
        call addAgiToSpeed(u, agi)
    endfunction
    // 减少单位敏捷
    function FF_SubAgi takes unit u, real agi returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_AGI, FF_Base_GetAgi(u) - agi)
        call SetUnitState( u, ConvertUnitState(0x51), GetUnitState(u, ConvertUnitState(0x51)) - agi / 2000.0 )
        call subAgiToSpeed(u, agi)
    endfunction
    // 减少百分比的敏捷
    function FF_SubAgiPercent takes unit u, real agiPercent returns nothing
        call FF_SubAgi(u, FF_Base_GetAgi(u) * agiPercent)
    endfunction
    // 增加百分比的敏捷
    function FF_AddAgiPercent takes unit u, real agiPercent returns nothing
        call FF_AddAgi(u, FF_Base_GetAgi(u) * agiPercent)
    endfunction

    //===================================================================

    // 设置智力加成
    function FF_SetAddition_Int takes unit u, real v returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_INT_ADDITION, v)
    endfunction
    // 获取智力加成
    function FF_GetAddition_Int takes unit u returns real
        return LoadReal(proHash, GetHandleId(u), FF_PRO_INT_ADDITION)
    endfunction
    // 增加智力加成
    function FF_AddAddition_Int takes unit u, real v returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_INT_ADDITION, FF_GetAddition_Int(u) + v)
    endfunction
    // 减少智力加成
    function FF_SubAddition_Int takes unit u, real v returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_INT_ADDITION, FF_GetAddition_Int(u) - v)
    endfunction
    // 设置单位的智力（注意：设置会重置属性附带的额外其他加成，谨慎使用，一般用于初始创建）
    function FF_SetInt takes unit u, real int returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_INT, int)
        call addIntToSpellDamage(u, int)
    endfunction
    // 获取单位的智力（基础）
    function FF_Base_GetInt takes unit u returns real
        return LoadReal(proHash, GetHandleId(u), FF_PRO_INT)
    endfunction
    // 获取单位的智力
    function FF_GetInt takes unit u returns real
        return FF_Base_GetInt(u) * (1.0 + FF_GetAddition_Int(u))
    endfunction
    // 增加单位智力
    function FF_AddInt takes unit u, real int returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_INT, FF_Base_GetInt(u) + int)
        call addIntToSpellDamage(u, int)
    endfunction
    // 减少单位智力
    function FF_SubInt takes unit u, real int returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_INT, FF_Base_GetInt(u) - int)
        call subIntToSpellDamage(u, int)
    endfunction
    // 减少百分比的智力
    function FF_SubIntPercent takes unit u, real intPercent returns nothing
        call FF_SubInt(u, FF_Base_GetInt(u) * intPercent)
    endfunction
    // 增加百分比的智力
    function FF_AddIntPercent takes unit u, real intPercent returns nothing
        call FF_AddInt(u, FF_Base_GetInt(u) * intPercent)
    endfunction


    // 设置全属性
    function FF_SetAllAttr takes unit u, real value returns nothing
        call FF_SetStr(u, value)
        call FF_SetAgi(u, value)
        call FF_SetInt(u, value)
    endfunction
    // 获取全属性（包括动态加成）
    function FF_GetAllAttr takes unit u returns real
        return FF_GetStr(u) + FF_GetAgi(u) + FF_GetInt(u)
    endfunction
    // 增加全属性
    function FF_AddAllAttr takes unit u, real value returns nothing
        call FF_AddStr(u, value)
        call FF_AddAgi(u, value)
        call FF_AddInt(u, value)
    endfunction
    // 减少全属性
    function FF_SubAllAttr takes unit u, real value returns nothing
        call FF_SubStr(u, value)
        call FF_SubAgi(u, value)
        call FF_SubInt(u, value)
    endfunction

    // 设置怪物的暴击几率
    function FF_SetEnemyCritPro takes unit u, real crit returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_CRIT, crit)
    endfunction
    // 获取怪物的暴击几率
    function FF_GetEnemyCritPro takes unit u returns real
        return LoadReal(proHash, GetHandleId(u), FF_PRO_CRIT)
    endfunction
    // 增加怪物的暴击几率
    function FF_AddEnemyCritPro takes unit u, real crit returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_CRIT, LoadReal(proHash, GetHandleId(u), FF_PRO_CRIT) + crit)
    endfunction
    // 减少怪物的暴击几率
    function FF_SubEnemyCritPro takes unit u, real crit returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_CRIT, LoadReal(proHash, GetHandleId(u), FF_PRO_CRIT) - crit)
    endfunction



    // 设置怪物的暴击伤害
    function FF_SetEnemyCritDamage takes unit u, real critDamage returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_CRIT_DAMAGE, critDamage)
    endfunction
    // 获取怪物的暴击伤害
    function FF_GetEnemyCritDamage takes unit u returns real
        return LoadReal(proHash, GetHandleId(u), FF_PRO_CRIT_DAMAGE)
    endfunction
    // 增加怪物的暴击伤害
    function FF_AddEnemyCritDamage takes unit u, real critDamage returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_CRIT_DAMAGE, LoadReal(proHash, GetHandleId(u), FF_PRO_CRIT_DAMAGE) + critDamage)
    endfunction
    // 减少怪物的暴击伤害
    function FF_SubEnemyCritDamage takes unit u, real critDamage returns nothing
        call SaveReal(proHash, GetHandleId(u), FF_PRO_CRIT_DAMAGE, LoadReal(proHash, GetHandleId(u), FF_PRO_CRIT_DAMAGE) - critDamage)
    endfunction



    // 销毁单位保存的属性
    function FF_DestroyUnitPro takes unit u returns nothing
        // 删除伤害触发
        call DestroyTrigger(FF_GetDamageEvent(u))
        // 清空数据
        call FlushChildHashtable(proHash, GetHandleId(u))
    endfunction


    // ================================= 临时的一些技能属性
    // 设置灼烧的次数
    function FF_TEMP_SetSK1 takes unit u, integer count returns nothing 
        call SaveInteger(proHash, GetHandleId(u), FF_TEMP_SK_1, count)
    endfunction
    // 获取灼烧的次数
    function FF_TEMP_GetSK1 takes unit u returns integer
        return LoadInteger(proHash, GetHandleId(u), FF_TEMP_SK_1)
    endfunction

    // 获取闪电持续伤害的次数
    function FF_TEMP_SetSK2 takes unit u, integer count returns nothing
        call SaveInteger(proHash, GetHandleId(u), FF_TEMP_SK_2, count)
    endfunction
    function FF_TEMP_GetSK2 takes unit u returns integer
        return LoadInteger(proHash, GetHandleId(u), FF_TEMP_SK_2)
    endfunction

    // 获取寒冰箭持续伤害的次数
    function FF_TEMP_SetSK3 takes unit u, integer count returns nothing
        call SaveInteger(proHash, GetHandleId(u), FF_TEMP_SK_3, count)
    endfunction
    function FF_TEMP_GetSK3 takes unit u returns integer
        return LoadInteger(proHash, GetHandleId(u), FF_TEMP_SK_3)
    endfunction
endlibrary


